/**
 * axios 二次封装
 */

import axios from "axios";
import config from './../config'
import { ElMessage } from "element-plus";
import router from "../router";

const TOKEN_INVALID = 'token失效,请重新登录';
const NETWORL_ERROR = '网络异常，请重试'

// 创建 axios 实例对象，添加全局配置
const service  = axios.create({
    baseURL: config.baseApi,
    timeout: 8000,
    // headers: {}
})

// 请求拦截
service.interceptors.request.use((req) => {
    // TO-DO ...
    const headers = req.headers;
    if (!headers.Authorization) {
        headers.Authorization = 'Bear this is token'
    }
    return req;
})

// 响应拦截
service.interceptors.response.use((res) => {
    console.log(res.data);
    const { code, data, msg } = res.data;
    switch(code) {
        case 200:
            return data;
        case 401:
            ElMessage.error(TOKEN_INVALID)
            setTimeout(() => {
                router.push('/login')
            }, 15000)
            return Promise.reject(TOKEN_INVALID)
        default:
            ElMessage.error(msg || NETWORL_ERROR)
    }
    return res;
})

/**
 * 请求核心函数
 * @param {*} options 请求配置
 * @returns 
 */
function request(options) {
    console.log(options);
    // 请求方式,默认为 get
    options.method = options.method || 'get'
    // 如果是 get 请求, 将 data 赋值给 params, 在请求时就可以统一使用 data 来传递参数
    if (options.method.toLowerCase() === 'get') {
        options.params = options.data;
    }
    // 局部mock，如果接口定义了是否 mock，以这个为准
    if (typeof options !== "undefined") {
        config.mock = options.mock;
    }
    // 如果是生产环境,去到 cofig 中拿到生产环境的 baseApi, 确保在生产环境使用的 baseURL 准确
    if(config.env === 'prod') {
        service.defaults.baseURL = config.baseApi;
    } else {
        // 如果是其他环境, 判断是否开启 mock 如果开启 mock 则使用 mock 的地址, 否则使用该环境的 baseApi
        service.defaults.baseURL = config.mock ? config.mockApi : config.baseApi;
    }
    console.log(service.defaults.baseURL);
    return service(options)
}

export default request;
